وبسایت برنامه نویسان توابع و رویه ها در پاسکال


تاریخ : یک شنبه 4 اسفند 1392 بازدید : 2643 نویسنده :  

معرفی چند تابع:

: abs
قدر مطلق عدد ورودی را محاسبه کرده و برمی گرداند. همانطور که در زیر می بینید، این تابع هم برای اعداد صحیح و هم برای اعداد حقیقی تعریف شده است.

 

function abs(x:integer) : integer;

function abs(x:real) : real;



مثال3:
برنامه ای بنویسید که یک عدد صحیح از ورودی دریافت کرده و قدر مطلق آن را در خروجی چاپ کند.

 

program Exam3;

 var

    n,ab: integer;

 begin

    write('Enter an integer number : ');

    readln(n);

    ab:= abs(n);

    writeln('|',n,'| = ',ab);

 end.

»» میتوان بدون ذخیره مقدار خروجی تابع، آن را نمایش داد؛

writeln('|',n,'| = ',abs(n));

تابع sin
وظیفه اش محاسبه و بازگرداندن سینوس یک عدد اعشاری است و به شکل زیر تعریف می شود؛

function sin(x:real) : real;

تابع cos
کسینوس یک عدد اعشاری را بر می گرداند؛

function cos(x:real) : real;

تابع arctan
بازگرداندن آرک تانژانت یک عدد اعشاری

function arctan(x:real) : real;

»» برای تبدیل درجه به رادیان از فرمول زیر استفاده می کنیم؛

rad := deg * 3.14159 / 180;

تابع exp
عدد نپر (e = 2.71828..) را به توان یک عدد اعشاری میرساند.

function exp(x:real) : real;

تابع frac
قسمت اعشاری یک عدد اعشاری را برمیگرداند.

function frac(x: real) : real;

مثال4:
برنامه ای بنویسید که یک عدد اعشاری از ورودی دریافت کرده و جزء اعشاری آن را در خروجی چاپ کند.

program Exam4;

 var

    r,fr: real;

 begin

    write('Enter an real number : ');

    readln(r);

    fr:= frac(r);

    writeln('fractional part of ',r :8:4,' is: ',fr:8:4);

 end.


تابع int

قسمت صحیح یک عدد اعشاری را برمی گرداند.

function int(x: real) : real;

»» دقت داشته باشید که نوع خروجی نیز اعشاری است.

تابع IoResult
مشخص می کند که عملیات ورودی –خروجی با موفقیت انجام شده یا خیر. اگر خروجی این تابع مقدار غیر صفر باشد عمل خواندن و نوشتن در فایل با شکست مواجه شد است.

function ioresult : integer;


تابع Ln
محاسبه لگاریتم یک عدد اعشاری در مبنای  e

function ln(x : real) : real;

تابع odd
زوج یا فرد بودن عدد صحیح را بررسی میکند.

function odd(x:longint) : boolean;

اگر مقدار خروجی true باشد x فرد و اگر مقدار خروجی false باشد x زوج است.

تابع ord
هدف: غالبا برای پیدا کردن کد ascii که متغیر کاراکتری به کار میرود.
شکل تابع:

کد:

function ord(x:char) : longint;

مثال 5:
برنامه ای بنویسید که کد ascii حروف الفبای کوچک انگلیسی را در خروجی چاپ کند.

program Ordfunc;

 var

    ch: char;

 begin

    for ch := 'a' to 'z' do

        write(ord(ch):4);

    writeln;

    write('Press enter to exit');

    readln;

 end.

 

تابع pi
هدف: عدد پی (3.1415) را برمیگرداند.

function pi: real;

مثال6:
برنامه ای بنویسید که شعاع یک دایره را از ورودی دریافت کرده و مساحت آن را چاپ کند.

program Exam6;

 var

    r: real;

 begin

    write('Enter radius : ');

    readln(r);

    writeln('Area = ',pi*r*r:2:3);

    readln;

 end.

 

تابع pred
هدف: مقدار قبل پارامتر را برمیگرداند. 

function pred(x) : {same type of x);


به عنوان مثال؛

ch:= pred('F');   -->  ch = E

i:= pred(11);   --> i = 10

flag:= pred(true);   -->  flag = false

 

تابع random
ار این تابع برای تولید عدد تصادفی استفاده م شود.

function random : real;

function ramdom (n:word) : word;

اگر تابع به صورت اول(بدون آرگومان) استفاده شود، یک عدد اعشاری تصادفی بین 0 و 1 تولید می کند و اگر به صورت دوم به کار برده شود یک عدد صحیح تصادفی بین 0 و n تولید خواهد کرد. اگر چندین بار این تابع را پشت سر هم فراخوانی کنید، همواره عددی مشابه فراخوانی اول تولید می کند. برای جلوگیری از وقوع چنین حالتی از رویه ی randomize استفاده می کنیم. فقط کافی است که این رویه را بصورت randomize; قبل از اولین فراخوانی تابع random، فراخوانی کنیم.

تابع round
گرد کردن اعداد اعشاری به نزدیکترین مقدار صحیح

function round(x:real) : longint;

تابع sqr   
محاسبه مجذور یک عدد صحیح یا اعشاری

function sqr(x:integer): integer;

function sqr(x:real) : real;

تابع sqrt
محاسبه جذر یک عدد

function sqrt(x) : {same type of parameter};

تابع SUCC
مقدار بعدی پارامتر ورودی را بر میگرداند. پارامتر ورودی می تواند هر عدد یا کاراکتری باشد.

function succ(x);

تابع trunc
هدف: قسمت صحیح یک عدد اعشاری را برمیگرداند.

function trunc(x:real) : longint;


تابع chr
معادل کاراکتری یک کد ascii را برمیگرداند.

function chr(x:byte) : char;

تابع upcase
کاراکتر ورودی را اگر حروف کوچک باشند، به حروف بزرگ تبدیل می کند.

function upcase(ch:char) : char;

 

 

مثال7:
برنامه ای بنویسید که عدد n را از ورودی دریافت کرده و با استفاده از یک تابع مجموع اعداد 1 تا n را چاپ کند.

 program Exam7;

 var

n,s: integer;

 function sum(num:integer) : integer;

  begin

sum(num):= num*(num+1) div 2;

  end;

 

 begin

writeln('Enter a number : ');

readln(n);

s:= sum(n);

writeln('Sum of 1 to ',n,' is : ',s);

readln;

 end.

 

روالها:
روال ها مشابه توابع عمل میکنند با این تفاوت که روال ها بدون نوع هستند و خروجی روالها از طریق پارامتر برگردانده میشود.  برای درک بهتر این مطلب لازم است مفهوم تعریف محلی متغیرها را به خوبی درک کرده باشید.
بنابراین ابتدا مبحث تعریف محلی یا سراسری متغیرها و سپس ارسال متغیرها بصورت ارجاع یا با مقدار را شرح می دهیم تا زمینه ی درک روالها فراهم شود.

متغیر های محلی و سراسری:
متغیر ها دوحالت دارند:
1. متغیر های محلی
2. متغیر های سراسری


متغیر های محلی یا داخلی در بلوک مربوط به خود قابل استفاده هستند. یعنی متغیر هایی که داخل یک تابع یا روال تعریف می شوند فقط در همان تابع شناخته می شوند. و در بیرون از آن نمی  توانیم آن متغیر را بکار بگیریم. اما متغیر های سراسری در تمام قسمت های برنامه و تمام برنامه های فرعی قابل استفاده هستند. متغیر های سراسری را در قسمت تعاریف برنامه ی اصلی تعریف می کنیم و متغیرهای محلی را در قسمت تعاریف در داخل آن تابع یا روال. شاید فکر میکنید که اگر متغیرهای سراسری در تمام برنامه قابل استفاده هستند چرا از متغیر های محلی استفاده کنیم. در پاسخ باید گفت که استفاده از متغیرهای محلی درصد خطای برنامه را کاهش می دهد و خطایابی را نیز آسان میکند. همچنین استفاده از متغیر های محلی از اشغال بی دلیل حافظه جلوگیری می کند. زیرا متغیرهای سراسری از آغاز اجرای برنامه تا پایان آن فضایی از حافظه را اشغال میکنند اما متغیر های محلی تنها زمانی که بلوک مربوط به آنها فراخوانی شود مورد استفاده قرار گرفته و پس از خاتمه یافتن بلوک مورد نظر، حافظه اشغالی آزاد میشود. بنابرین بهتر است در صورت امکان از متغیرهای محلی استفاده شود.

روشهای ارسال پارامتر به زیر برنامه ها:
پارامتر ها را به دو صورت می توانیم به توابع یا روالها ارسال کنیم؛
      1- ارسال با مقدار

      2- ارسال با ارجاع
هنگامی که متغیری را بصورت مقداری به تابع ارسال می کنیم، مثلاً i=3 را به تابع یا رویه ای می فرستیم، زیربرنامه فقط مقدار آن متغیر را دریافت می کند و به خود متغیر دسترسی ندارد. اما در ارسال متغیرها به زیربرنامه بصورت ارجاعی، آدرس محل ذخیره سازی مقدار متغیر به زیر برنامه ارسال می شود. بنابر این زیربرنامه می تواند مقدار متغیر را بخواند و آن را تغییر دهد. ارسال با ارجاع در روالها کاربرد فراوانی دارد.

ارسال پارامترها به زیر برنامه ها بصورت پیشفرض از جنس ارسال مقداری است. ارسال متغیرها با ارجاع بصورت زیر انجام می شود؛

procedure name(var VariableParam1 : {type},...);

یعنی اگر بخواهیم متغیری را بصورت ارجاعی به یک رویه بفرستیم، باید قبل از نام متغیر کلمه ی Var را قرار دهیم.

حال که با مفهوم متغیرهای سراسری و محلی و نحوه ی ارسال پارامترها به زیربرنامه ها آشنا شدید، می توانیم در ادامه به بیان ساختار روالها بپردازیم.

ساختار روالها:

شکل کلی روال ها به صورت زیر میباشد:

procedure name ({parameters list});

 var

            {list of local variables}

 begin

            {procedure body-commands}

 end;


در تعریف روال باید توجه ویژه به نوع پارامتر ها و ترتیب آنها داشته باشیم تا در موقع فراخوانی مشکل پیش نیاید.


مثال8:
برنامه ای بنویسد که عدد n را از ورودی خوانده و با استفاده از روال، مجموع اعداد صحیح 1 تا n را محاسبه و چاپ کند.

program Exam8;

 var

            n,S:integer;

 procedure Sum (num:integer; var S1: integer);

  begin

            S1:= n*(n+1) div 2;

  end;

 begin

    writeln('Enter a number : ');

    readln(n);

    sum(n,S);

    writeln('Sum of 1 to ',n,' is : ',S);

    readln;

 end.


نکته1»» برای اینکه یک زیربرنامه بتواند به یک زیر برنامه ی دیگر دسترسی داشته باشد، یک راه این است که زیربرنامه ی دوم داخل آن زیربرنامه تعریف شود.

نکته2»» بین روال هایی که در بخش تعاریف یک برنامه تعریف می شوند رابطهی زیر برقرار است؛

در روال های بعدی امکان رجوع به روالهای قبلی وجود خواهد داشت. مثلا اگر سه روال به نام های p1,p2,p3 داشته باشیم که به ترتیب شماره درون در برنامه ی اصلی تعریف شده باشند، در این صورت روال p2 و p1 را میتوان داخل روال p3 فراخوانی کرد اما عکس آن امکان پذیر نیست.
همچنین روال های متداخل نیز میتوانند به روال های بیرونی که پیش تر تعریف شده اند، دسترسی داشته باشند.

نکته3»» برای اینکه یک زیربرنامه هم در روالهای قبلی و هم در روالهای بعدی قابل فراخوانی باشد، از کلمه ی ذخیره شده ی forward در خط تعریف روال بصورت زیر استفاده می کنیم؛

procedure name(parameters list) ; forward;

معرفی چند روال

روال dec
یک یا چند واحد از پارامتر ورودی کم میکند. پارامتر ورودی این روال می تواند کاراکتر یا عدد صحیح باشد.

procedure dec(x: longint);

procedure dec(x:{type}, n:{type});


مثال9:

program Exam9;

 var

       x,n: integer;

 begin

      writeln('Enter a number and amount to decrease from it : ');

      readln(x,n);

     dec(x,n);

     writeln(x);

     readln;

 end.


روال halt
به اجرای رنامه خاتمه می دهد. این رویه بصورت زیر فراخوانی می شود؛

halt;

روال inc
اضافه کردن یک یا چند واحد به یک متغیر

procedure in(x:{type},n:{type});


توابع و روال های کتابخانه ای برای متغیر های رشته ای:

تابع concat
الحاق کردن (concatenate) دو یا چند رشته به یکدیگر.

function concat (s1,s2,..,sn) : string;

برای مثال خروجی دستور زیر

concat("Mohammmad"," ","Sadat"," ","Shahabi");

عبارت Mohammad Sadat Shahabi است.

تابع copy
کپی کردن یک زیر رشته (substring) از یک رشته در رشته ای دیگر.

function copy (s:string,index:integer,count:integer) : string;

بعنوان مثال دستور زیر

S1 := copy("Mohammad Sadegh",10,6);

خروجی Sadegh را در S1  ذخیره می کند. این دستور کپی به این صورت عمل می کند که از دهمین کاراکتر رشته ای که دریافت کرده بطول شش کاراکتر را کپی کرده و در S1 قرار می دهد.

تابع length
محاسبه طول رشته.

function length(s:string) : integer;

تابع pos
مکان  اولین وقوع رشته S2 در رشته S1 را به صورت عدد صحیح برمیگرداند .

function pos(S1:string, S2:string) : byte;

اگر رشته مورد نظر یافت نشود مقدار تابع صفر (0) خواهد بود.

معرفی چند روال

روال delete
حذف یک زیر رشته از یک رشته.

procedure delete(s:string,index:integer,length:integer);


روال insert
درج یک رشته در رشته دیگر

procedure insert(S1:string,S2:string,index:integer);

روال insert رشته ی S1 را از موقعیت Index در رشته S2 درج میکند.


روال Str
تبدیل یک عدد به یک رشته عددی.

procedure str(i:integer:{format},s:string);

procedure str(f:real:{format},s:string);

 

روال val
تبدیل یک رشته عددی به یک عدد.

procedure val(s:string,i:integer/real,error:integer);

نکته»» error، یک متغیر از نوع صحیح که در صورت وقوع خطا، محل وقوع آن را مشخص می کند. و در صورتی که خطایی نداشته باشیم، مقدار صفر را در آن ذخیره می کند.

ارسال آرایه ها به توابع و روال ها


آرایه ها مجموعه ای از داده ها می باشند. و به خاطر حجم بالایی که دارند  ارسال آنها به توابع و روال ها بصورت مقداری، سربار  بسیار زیادی دارد و منطقی نیست. برای ارسال آرایه ها به عنوان پارامتر به برنامه های فرعی باید آرایه را از نوع TYPE تعریف کنیم؛

 type IntArray = array [1..100] of integer;

مثال بالا، نحوه ی تعریف نوع داده ی آرایه ای 100 عنصری از جنس اعداد صحیح را نشان می دهد. برای استفاده از آن باید متغیری از جنس IntArray مطابق زیر تعریف کنیم؛

var x: IntArray;




:: موضوعات مرتبط: مبانی کامپیوتر و برنامه سازی , ,